package com.hingsmy.pma.logging;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.sql.Array;
import java.util.Arrays;

@Aspect//该类使用@Aspect注解，使其成为一个「切面
@Component
public class ApplicationLoggerAspect {
    private  final Logger log= LoggerFactory.getLogger(this.getClass());

    //使用@Pointcut定义切点，将within参数中指定的位置设定为切点,注解参数中within(com.hingsmy.pma.controllers..*)
    // 表示controllers包中全部的类中全部的方法
    @Pointcut("within(com.hingsmy.pma.controllers..*)"+"||within(com.hingsmy.pma.dao..*)")
    public void definePackagePointcuts(){

    }
//    @After("definePackagePointcuts()")
//    //该方法使用@After注解，表示上面定义的切点（@Pointcut）被访问后，触发该方法的执行。
//    public void logAfter(JoinPoint joinPoint){
//        log.debug("\n\n\n");
//        log.debug("******************方法执行前***************");
//        log.debug(joinPoint.getSignature().getName(),joinPoint.getSignature().getDeclaringTypeName(),
//                Arrays.toString(joinPoint.getArgs())
//
//        );
//        log.debug("-----------------------------------------");
//    }
//    @Before("definePackagePointcuts()")
//    //也有@Before注解，表示切点被触发前执行的动作。
//    //编写log2方法，使用@Before注解，并将原来的log方法改为log2：
//    public void  logBefore(JoinPoint joinPoint){
//        log.debug("\n\n\n");
//        log.debug("************************方法执行后***********************");
//        log.debug(joinPoint.getSignature().getName(),joinPoint.getSignature().getDeclaringTypeName(),
//                Arrays.toString(joinPoint.getArgs())
//                );
//        log.debug("----------------------------------------------------------");
//        log.debug("\n\n\n");
//    }

    @Around("definePackagePointcuts()")
    public Object  logAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.debug("\n\n\n");
        log.debug("************************方法执行前***********************");
        log.debug(proceedingJoinPoint.getSignature().getName(),proceedingJoinPoint.getSignature().getDeclaringTypeName(),
                Arrays.toString(proceedingJoinPoint.getArgs())
        );
        log.debug("----------------------------------------------------------");
        log.debug("\n\n\n");
        Object object=proceedingJoinPoint.proceed();
        log.debug("\n\n\n");
        log.debug("************************方法执行后***********************");
        log.debug(proceedingJoinPoint.getSignature().getName(),proceedingJoinPoint.getSignature().getDeclaringTypeName(),
                Arrays.toString(proceedingJoinPoint.getArgs())
        );
        log.debug("----------------------------------------------------------");
        log.debug("\n\n\n");
        return object;
    }
}
